<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>154闭包</title>
</head>

<body>
  <h1>154闭包</h1>
  <script>
    /*
      一、闭包
        1 一个函数对周围状态的引用捆绑在一起，内层函数访问到其外层函数的作用域。
        2 简而言之，闭包就是 内层函数 + 外层函数的变量。

      二、闭包的作用
        1 封闭数据，提供操作，实现数据的私有化。外部也可以访问函数内部的变量。

      三、闭包的弊端
        1 过多的使用闭包，可能会导致内存泄漏。
    */
    function outer() {
      let a = 1
      function inner() {
        console.log(a)
      }
      inner()
    }
    outer()

    function fn() {
      let i = 1
      function fn() {
        console.log(i)
      }
      return fn
    }
    const f = fn()
    f() // 通过闭包，实现外部成功访问到函数fn的局部变量i

    function a() {
      let i = 0
      function b() {
        i++
        console.log('i=>' + i)
      }
      return b
    }
    let c = a() // c是对函数b的引用，函数b又引用了局部变量i，根据GC机制的标记清除算法可知，变量i无法被释放。
    c()

    // 全局变量j，很容易被外部修改，通过闭包将其私有化，封闭数据。
    let j = 0
    function demo() {
      j++
      console.log('j=>' + j)
    }
    demo()
  </script>
</body>

</html>